package sad.dao;

import com.db4o.ObjectSet;
import com.db4o.query.Query;
import java.util.ArrayList;
import sad.modelo.Questao;
import sad.modelo.SubTopico;
import sad.util.DAOEvent;
import sad.visao.QuestaoTableModel;

public class QuestaoTableDAO extends AbstractDAO {
    
  private static QuestaoTableDAO INSTANCE=null;
  private static QuestaoTableModel tableModel;
  private static Object[] dados;
  
  public static QuestaoTableDAO getInstance(){
        if (QuestaoTableDAO.INSTANCE ==null){
            QuestaoTableDAO.INSTANCE = new QuestaoTableDAO();
        }
        return QuestaoTableDAO.INSTANCE;
    }
    
  //C(reate)R(etrieve)U(pdate)D(elete)
  public static void createTableQuestao(){
        tableModel = new QuestaoTableModel();
        Query query = DAO.getObjectContainer().query();
        query.constrain(Questao.class);
        query.descend("enunciado").orderAscending();
        ObjectSet produtoList = query.execute();
    
        while(produtoList.hasNext()) {
            Questao proto = (Questao)produtoList.next();
            tableModel.addQuestao(proto);
        }
        tableModel.sortByNome();
  }
public void create(String fonte, String enunciado, String justificativa, SubTopico subTopico, ArrayList listaAlternativa){
        //Cria uma nova disciplina com os dados
        Questao q = new Questao();
        q.setFonte(fonte);
        q.setEnunciado(enunciado);
        q.setJustificativa(justificativa);
        q.setSubTopico(subTopico);
        q.setAlternativa(listaAlternativa);
        
        //Se foi tudo criado e armazenado OK no Banco, add Questao na tabela
        if(DAO.create(q)){
            addQuestao(q);
        }else{
            //avisa que deu problema no Banco
            QuestaoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(q.getEnunciado(), DAOEvent.DAO_NOCREATE));
        }
    }
    public void addQuestao(Questao q) {
        if (tableModel!=null){
            tableModel.addQuestao(q);
            tableModel.sortByNome();
        }  
    }
    public static Questao getQuestaoSaved(String enunciado) {
        Questao proto = new Questao();
        proto.setEnunciado(enunciado);
        return (Questao) DAO.retrieve(proto);
     }
    public QuestaoTableModel getTableQuestao() {
        return tableModel;
    }

    public void removeQuestao(int indexLine) {
        QuestaoTableDAO.getInstance().delete(tableModel.getQuestao(indexLine));
        tableModel.removeQuestao(indexLine);
        
        QuestaoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(indexLine, DAOEvent.DAO_DELETE));
    }

    public Object[] isEditable(int indexLine) {
        Questao q = tableModel.getQuestao(indexLine);
        String qe = "Sem Questao";
        if(q.getEnunciado()!=null){
            qe = q.getSubTopico().getNome();
        }
        Object[] o = {q.getEnunciado(), q.getJustificativa(), qe, indexLine}; 
        dados=o;
        return dados;
    }

    public int getIndexQuestao() {
        int i= Integer.parseInt(dados[3].toString());
        return i;
    }
    
    public Questao getQuestaoAt(int i) {
        return tableModel.getQuestao(i);
    }
    
    public void update(Questao q, int i){
        
        tableModel.setValueAt(q, i, 0);
        tableModel.setValueAt(q, i, 1);
        tableModel.setValueAt(q, i, 2);
        tableModel.setValueAt(q, i, 3);
        tableModel.setValueAt(q, i, 4);
        tableModel.sortByNome();
        QuestaoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(tableModel, DAOEvent.DAO_UPDATE));
    }
}